/*
 * -------------------------------------------------------------------------------
 * @FilePath     : app_iic.c
 * @Description  : application
 * Copyright (c) 2023 by NanoIC, All Rights Reserved. 
 * @Date         : 2023-11-10 14:48:44
 * @LastEditTime : 2023-11-10 19:17:37
 * @Author       : LvH
 * -------------------------------------------------------------------------------
 */

#include "app_iic.h"
#include "app_cfg.h"
#include "app_parameter.h"

csi_iic_master_config_t  tIicMasterCfg;  // 主机初始化结构体变量
csi_error_t iic_err_state = -1;


/// @brief IIC IO 初始化
/// @param  
void app_iic_io_init(void)
{
    csi_pin_output_mode(IIC_PING_SCL,GPIO_OPEN_DRAIN);
    csi_pin_output_mode(IIC_PIN_SDA,GPIO_OPEN_DRAIN);

    csi_pin_set_mux(IIC_PING_SCL,PA112_I2C0_SCL);
    csi_pin_set_mux(IIC_PIN_SDA,PA113_I2C0_SDA);
	
	csi_pin_pull_mode(IIC_PING_SCL,GPIO_PULLUP);
	csi_pin_pull_mode(IIC_PIN_SDA,GPIO_PULLUP);
}
	void app_iic_io_sleep_set(void)
{
    csi_pin_set_mux(IIC_PING_SCL,PA112_GPD);
    csi_pin_set_mux(IIC_PIN_SDA,PA113_GPD);
}

/// @brief IIC 初始化
/// @param
void app_iic_init(void)
{
    app_iic_io_init();
    tIicMasterCfg.byAddrMode = IIC_ADDRESS_7BIT;			// 设置主机地址模式 7/10 bit
    tIicMasterCfg.byReStart = ENABLE;						// 使能重复起始位
    tIicMasterCfg.bySpeedMode = IIC_BUS_SPEED_FAST;			// 设置主机速度模式	IIC_BUS_SPEED_STANDARD <=100kHz   IIC_BUS_SPEED_FAST <=400kHz    IIC_BUS_SPEED_FAST_PLUS <=  1MHz
    tIicMasterCfg.hwInt = IIC_INTSRC_NONE;					// 使能需要的中断
    tIicMasterCfg.wSdaTimeout = 0XFFFF;						// SDA 超时时间设置，  1/主频 * tIicMasterCfg.wSdaTimeout  ms
    tIicMasterCfg.wSclTimeout = 0XFFFF;						// SCL 超时时间设置，  1/主频 * tIicMasterCfg.wSdaTimeout  ms
    iic_err_state = csi_iic_master_init(I2C0,&tIicMasterCfg);

}

/// @brief IIC 初始化
/// @param
void app_iic_reset(void)
{
	if(iic_err_state!=CSI_OK)
	{
		app_iic_io_init();
		tIicMasterCfg.byAddrMode = IIC_ADDRESS_7BIT;			// 设置主机地址模式 7/10 bit
		tIicMasterCfg.byReStart = ENABLE;						// 使能重复起始位
		tIicMasterCfg.bySpeedMode = IIC_BUS_SPEED_FAST;			// 设置主机速度模式	IIC_BUS_SPEED_STANDARD <=100kHz   IIC_BUS_SPEED_FAST <=400kHz    IIC_BUS_SPEED_FAST_PLUS <=  1MHz
		tIicMasterCfg.hwInt = IIC_INTSRC_NONE;					// 使能需要的中断
		tIicMasterCfg.wSdaTimeout = 0xFFFF;						// SDA 超时时间设置，  1/主频 * tIicMasterCfg.wSdaTimeout  ms
		tIicMasterCfg.wSclTimeout = 0xFFFF;						// SCL 超时时间设置，  1/主频 * tIicMasterCfg.wSdaTimeout  ms
		iic_err_state = csi_iic_master_init(I2C0,&tIicMasterCfg);
		rec_single_evt_test(MaintenanceServiceID,REMOTE_EVT_IIC_STA,0x01,0x01,0x05);
	}

}




/// @brief iic 写入数据
/// @param iicAddr 设备地址
/// @param pData 写入的数据指针
/// @param Size 写入长度
/// @return errcode
csi_error_t app_iic_write(uint16_t iicAddr,uint8_t *pData,uint16_t Size)
{
//    csi_error_t errcode;
//    uint32_t two_byte = 0;
//    two_byte = pData[1];
//    two_byte |= pData[0] << 8;
//    errcode = csi_iic_write_nbyte(I2C0,iicAddr,two_byte,0,pData,Size);
    return csi_iic_write_nbyte(I2C0,iicAddr,NULL,0,pData,Size);
}

/// @brief 读取数据
/// @param iicAddr 设备地址
/// @param pData 读取数据指针
/// @param Size 读取长度
/// @return 
csi_error_t app_iic_read(uint16_t iicAddr,uint8_t *pData,uint16_t Size)
{
    csi_error_t errcode;
    errcode = csi_iic_read_nbyte(I2C0,iicAddr,0x0000,0,pData,Size);
    return errcode;
}

/// @brief iic 写入数据（寄存器模式）
/// @param iicAddr 设备地址
/// @param pWData 要写的寄存器地址
/// @param wSize 要写的寄存器地址大小
/// @param pRData 写取的数据指针
/// @param rSize 写长度
/// @return 
csi_error_t app_iic_write_register(uint16_t iicAddr,uint32_t regAddr,uint8_t addrSize,uint8_t *pWData,uint16_t wSize)
{
    uint8_t errcode;
    errcode = csi_iic_write_nbyte(I2C0,iicAddr,regAddr,addrSize,pWData,wSize);
    return errcode;
}

/// @brief iic 读数据（寄存器模式）
/// @param iicAddr 设备地址
/// @param pWData 要读的寄存器地址
/// @param wSize 要读的寄存器地址大小
/// @param pRData 读取的数据指针
/// @param rSize 读取长度
/// @return errcode
csi_error_t app_iic_read_register(uint16_t iicAddr,uint32_t regAddr,uint8_t addrSize,uint8_t *pRData,uint16_t rSize)
{
    csi_error_t errcode;
    errcode = csi_iic_read_nbyte(I2C0,iicAddr,regAddr,addrSize,pRData,rSize);
    return errcode;
}

csi_error_t app_iic_read_register_buff(uint16_t iicAddr,uint8_t *regAddr,uint8_t addrSize,uint8_t *pRData,uint16_t rSize)
{
    csi_error_t errcode = CSI_OK;
    errcode = csi_iic_write_nbyte_read_nbyte(I2C0,iicAddr,regAddr,addrSize,pRData,rSize);
    return errcode;
}

/**
 * @brief :通过IIC总线从设备中读取数据
 * 
 * @param iicAddr: IIC设备地址
 * @param pWData: 要写入的数据指针
 * @param wSize: 要写入的数据长度，不能大于8
 * @param pRData: 要读取的数据
 * @param rSize: 要读取的数据长度
 * 
 * @return 错误代码
 */
uint32_t app_iic_read_buf_register(uint16_t iicAddr,uint8_t *pWData,uint8_t wSize,uint8_t *pRData,uint16_t rSize)
{
    uint8_t errcode;
    uint32_t two_byte = 0;
    two_byte = pWData[1];
    two_byte |= pWData[0] << 8;
    errcode = csi_iic_read_nbyte(I2C0,iicAddr,two_byte,wSize,pRData,rSize);
    return (uint32_t)errcode;
}



